﻿//using System.Collections.Immutable;
//using System.Linq;
//using Microsoft.CodeAnalysis;
//using Microsoft.CodeAnalysis.CSharp;
//using Microsoft.CodeAnalysis.CSharp.Syntax;
//using Microsoft.CodeAnalysis.Diagnostics;
//using UIOC.CodeAnalysis.Analyzers;

//namespace UIOC.CodeAnalysis.Suppressors;

//[DiagnosticAnalyzer(LanguageNames.CSharp)]
//internal sealed class FileFieldNamingSuppressor : DiagnosticSuppressor {

//    // 要抑制的警告ID（IDE1006：命名不符合规范）
//    private const string NamingWarningId = "IDE1006";

//    public override ImmutableArray<SuppressionDescriptor> SupportedSuppressions =>
//        ImmutableArray.Create(SuppressNamingWarning);

//    // 定义抑制规则
//    private static readonly SuppressionDescriptor SuppressNamingWarning = new(
//        id: $"SUPPRESS_{NamingWarningId}",
//        suppressedDiagnosticId: NamingWarningId,
//        justification: "符合字段访问规则的属性自动抑制命名警告"
//    );

//    public override void ReportSuppressions(SuppressionAnalysisContext context) {
//        foreach (var diagnostic in context.ReportedDiagnostics) {
//            // 只处理IDE1006警告
//            if (diagnostic.Id != NamingWarningId)
//                continue;

//            // 检查警告是否来自属性声明
//            if (diagnostic.Location.SourceTree?.GetRoot(context.CancellationToken).FindNode(diagnostic.Location.SourceSpan) is not PropertyDeclarationSyntax property) {
//                continue;
//            }

//            // 检查属性是否符合字段访问规则（复用分析器的判断逻辑）
//            var analyzer = new FileFieldAnalyzer();
//            if (IsPropertyCompliant(property, analyzer)) {
//                // 抑制该警告
//                context.ReportSuppression(Suppression.Create(
//                    SuppressNamingWarning,
//                    diagnostic
//                ));
//            }
//        }
//    }

//    // 判断属性是否符合访问规则（用于决定是否抑制警告）
//    private bool IsPropertyCompliant(PropertyDeclarationSyntax property, FileFieldAnalyzer analyzer) {
//        // 1. 无setter
//        if (analyzer.HasSetter(property))
//            return false;

//        // 2. 表达式体属性（如 => field__xxx__）
//        if (property.ExpressionBody != null) {
//            return analyzer.IsStrictAllowedExpression(property.ExpressionBody.Expression);
//        }

//        // 3. 显式getter（如 get => ... 或 get { return ... }）
//        var getAccessor = property.AccessorList?.Accessors
//            .FirstOrDefault(a => a.IsKind(SyntaxKind.GetAccessorDeclaration));
//        if (getAccessor == null)
//            return false;

//        // 表达式体getter（get => ...）
//        if (getAccessor.ExpressionBody != null) {
//            return analyzer.IsStrictAllowedExpression(getAccessor.ExpressionBody.Expression);
//        }

//        // 块体getter（get { return ... }）
//        if (getAccessor.Body != null) {
//            var statements = getAccessor.Body.Statements;
//            return statements.Count == 1
//                   && statements[0] is ReturnStatementSyntax returnStmt
//                   && returnStmt.Expression != null
//                   && analyzer.IsStrictAllowedExpression(returnStmt.Expression);
//        }

//        return false;
//    }
//}
